package com.tedu.api.io;

import org.junit.Test;

import java.io.*;

/**
 * 【高级流】对象流---传输对象---【使用频次高】实现序列化接口Serializable：功能：将对象转换为二进制
 *                                       版本号：一定要写，对象写出，对象读入，必须有统一版本号
 * ObjectOutputStream    对象输出流   写出----Person.java
 * ObjectInputStream     对象输入流   读入----Person.java
 *
 */
public class ObjectIO {

    //需求： 将 Person.java 文件 变成对象 写出---序列化
    @Test
    public void testOOS() throws IOException {
        //传输对象：创建对象
        Person p=new Person();
        p.setName("韩美娟");
        //String[] say=new String[]{}
        // 字符串数组：动态数组传输---给定元素决定数组长度
        p.setSay(new String[]{"百因必有果，你的报应就是我！！"});
        //System.out.println(p);
        //传输符合条件对象---输出流---xxx.obj  文件是一种对象文件保存格式
        //创建低级流--写出   对象格式：person.obj

            FileOutputStream fos=new FileOutputStream("person.obj");
            //高级流：ObjectOutputStream
            ObjectOutputStream oos=new ObjectOutputStream(fos);
            /**
             * writeObject(Object obj)---写出对象
             * 作用：将给定的对象按照其结构进行转换，转换为一组字节，
             *     在通过处理的流写出，写出格式：xxx.obj
             *
             * 抛出异常：NotSerializableException  没有实现序列化接口
             * 原因：传输对象上没有实现Serializable序列化接口
             *
             * Person 类---去掉实现序列化接口：Serializable
             *
             * 对象文件传输需要经过两个步骤：（专业术语）
             * 1.通过对象输出流将Person类，转换为一组”组“字节，这个过程对象序列化
             * 2.将序列化后的字节数据在通过字节流（低级流）写到项目中（硬盘上）做长久
             * 的保存，这个过程：数据持久化！
             */
            oos.writeObject(p);

        System.out.println("写出成功--");
    }




    /**
     * ObjectInputStream      对象输入流/反序列化
     * 反序列化----二进制转换为对象
     *
     * InvalidClassException  反序列化出现异常：版本号不匹配
     *
     * ClassNotFoundException    没有这个类型异常
     *                   产生原因：读入对象不正确，永久保存数据，类型读入不对
     *                          person1.class   person.obj
     *                          person2.class
     */
    @Test
    public void testOIS(){
        //创建输入流---peron.obj--读入
        FileInputStream fis=null;
        ObjectInputStream ois=null;
        try {
            fis=new FileInputStream("person.obj");
            //创建高级流---对象输入流
            ois=new ObjectInputStream(fis);
            //readObject()  返回读取的对象，反序列操作
            System.out.println(ois.readObject());
        } catch (IOException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } finally {
            if(ois!=null)
                try {
                    ois.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
        }
    }






}
